package com.cherish.pattern.singleton.lazy;

/**
 * @Classname LazyDubleCheckSinglten
 * @Date 2019/3/11 23:13
 * @Author admin
 * @Description 双重检查 懒汉单例模式的一般写法
 * <p>
 * 懒汉单例模式在调用的时候初始化
 * 避免了内存空间的浪费
 */
public class LazyDubleCheckSinglten {

    //单例模式第一步：构造方法私有化
    private LazyDubleCheckSinglten() {
    }

    /**
     * volatile特性
     * 可见性：当多个变量访问同一个变量X 当线程1修改了X的值时 线程2线程n能够立即读取到线程1修改后的值
     * 有序性：Java内存模型中允许编译器和处理器对指令重排序 重排序会不会影响单线程的执行  却会形象到多线程的执行
     * <p>
     * volatile适用场景
     * 对变量的写操作不依赖当前值  对变量的读操作不依赖非volatile变量
     * 适用于读多写少的场景
     * 用作状态标志
     */
    private volatile static LazyDubleCheckSinglten lazy = null;

    public LazyDubleCheckSinglten getInstance() {
        //加锁  防止多线程环境下对象被重复创建
        if (null == lazy) {
            synchronized (this.getClass()) {
                if (null == lazy) {
                    lazy = new LazyDubleCheckSinglten();
                }
            }
        }
        return lazy;
    }


}
